package lin

import (
	"errors"
	"fmt"
	"io"
	"os"
	"os/exec"
	"syscall"
	"embed"
)

type W文件 struct {
}

func (*W文件) QX取运行目录() string {
	dir, err := os.Getwd()
	if err != nil {
		fmt.Println(err)
	}
	return dir
}

//调用格式： 〈逻辑型〉 创建目录 （文本型 欲创建的目录名称） - 系统核心支持库->磁盘操作
//英文名称：MkDir
//创建一个新的目录。成功返回真，失败返回假。本命令为初级命令。
//参数<1>的名称为“欲创建的目录名称”，类型为“文本型（text）”。
//
//操作系统需求： Windows、Linux

func (*W文件) C创建目录(欲创建的目录名称 string) error {
	return os.Mkdir(欲创建的目录名称, os.ModePerm)
}

//调用格式： 〈逻辑型〉 删除目录 （文本型 欲删除的目录名称） - 系统核心支持库->磁盘操作
//英文名称：RmDir
//删除一个存在的目录及其中的所有子目录和下属文件，请务必谨慎使用本命令。成功返回真，失败返回假。本命令为初级命令。
//参数<1>的名称为“欲删除的目录名称”，类型为“文本型（text）”。该目录应实际存在，如果目录中存在文件或子目录，将被一并删除，因此使用本命令请千万慎重。
//
//操作系统需求： Windows、Linux

func (*W文件) S删除_目录(欲删除的目录名称 string) error {
	return os.RemoveAll(欲删除的目录名称)
}

// I复制文件 调用格式： 〈逻辑型〉 复制文件 （文本型 被复制的文件名，文本型 复制到的文件名） - 系统核心支持库->磁盘操作
// 英文名称：FileCopy
// 成功返回真，失败返回假。本命令为初级命令。
// 参数<1>的名称为“被复制的文件名”，类型为“文本型（text）”。
// 参数<2>的名称为“复制到的文件名”，类型为“文本型（text）”。
//
// 操作系统需求： Windows、Linux
func (*W文件) F复制文件(被复制的文件名 string, 复制到的文件名 string) error {
	src, err := os.Open(被复制的文件名)
	if err != nil {
		return err
	}
	defer src.Close()
	dst, err := os.OpenFile(复制到的文件名, os.O_WRONLY|os.O_CREATE, os.ModePerm)
	if err != nil {
		return err
	}
	defer dst.Close()
	_, err = io.Copy(dst, src)
	return err
}

func (*W文件) F复制文件夹(被复制的文件夹名路径 string, 复制到的文件夹名路径 string) error {
 return	copyFolder(被复制的文件夹名路径,复制到的文件夹名路径)

}


// I移动文件 调用格式： 〈逻辑型〉 移动文件 （文本型 被移动的文件，文本型 移动到的位置） - 系统核心支持库->磁盘操作
// 英文名称：FileMove
// 将文件从一个位置移动到另外一个位置。成功返回真，失败返回假。本命令为初级命令。
// 参数<1>的名称为“被移动的文件”，类型为“文本型（text）”。
// 参数<2>的名称为“移动到的位置”，类型为“文本型（text）”。
//
// 操作系统需求： Windows、Linux
func (*W文件) Y移动文件(被移动的文件 string, 移动到的位置 string) error {
	return os.Rename(被移动的文件, 移动到的位置)
}

//调用格式： 〈逻辑型〉 删除文件 （文本型 欲删除的文件名） - 系统核心支持库->磁盘操作
//英文名称：kill
//成功返回真，失败返回假。本命令为初级命令。
//参数<1>的名称为“欲删除的文件名”，类型为“文本型（text）”。
//
//操作系统需求： Windows、Linux

func (*W文件) S删除_文件(欲删除的文件名 string) error {
	return os.Remove(欲删除的文件名)
}

// I文件更名 调用格式： 〈逻辑型〉 文件更名 （文本型 欲更名的原文件或目录名，文本型 欲更改为的现文件或目录名） - 系统核心支持库->磁盘操作
// 英文名称：name
// 重新命名一个文件或目录。成功返回真，失败返回假。本命令为初级命令。
// 参数<1>的名称为“欲更名的原文件或目录名”，类型为“文本型（text）”。
// 参数<2>的名称为“欲更改为的现文件或目录名”，类型为“文本型（text）”。
//
// 操作系统需求： Windows、Linux
func (*W文件) G更换_文件名(欲更名的原文件或目录名 string, 欲更改为的现文件或目录名 string) error {
	return os.Rename(欲更名的原文件或目录名, 欲更改为的现文件或目录名)
}

//
//调用格式： 〈逻辑型〉 文件是否存在 （文本型 欲测试的文件名称） - 系统核心支持库->磁盘操作
//英文名称：IsFileExist
//判断指定的磁盘文件是否真实存在。如存在返回真，否则返回假。本命令为初级命令。
//参数<1>的名称为“欲测试的文件名称”，类型为“文本型（text）”。
//
//操作系统需求： Windows、Linux

func (*W文件) P判断文件_是否存在(欲测试的文件名称 string) bool {
	if stat, err := os.Stat(欲测试的文件名称); stat != nil && !os.IsNotExist(err) {
		return true
	}
	return false
}

//调用格式： 〈整数型〉 取文件尺寸 （文本型 文件名） - 系统核心支持库->磁盘操作
//英文名称：FileLen
//返回一个文件的长度，单位是字节。如果该文件不存在，将返回 -1。本命令为初级命令。
//参数<1>的名称为“文件名”，类型为“文本型（text）”。
//
//操作系统需求： Windows、Linux

func (*W文件) QW取文件_尺寸(文件名 string) int64 {
	f, err := os.Stat(文件名)
	if err == nil {
		return f.Size()
	} else {
		return -1
	}
}

// I取临时文件名 调用格式： 〈文本型〉 取临时文件名 （［文本型 目录名］） - 系统核心支持库->磁盘操作
// 英文名称：GetTempFileName
// 返回一个在指定目录中确定不存在的 .TMP 全路径文件名称。本命令为初级命令。
// 参数<1>的名称为“目录名”，类型为“文本型（text）”，可以被省略。如果省略本参数，默认将使用系统的标准临时目录。
//
// 操作系统需求： Windows
// func  (*Wb_文件)I取临时文件名(目录名 string) (f *os.File, filepath string, err error) {
// 	prefix := ""
// 	f, err = os.TempFile(目录名, prefix)
// 	filepath = 目录名 + f.Name()
// 	return f, filepath, err
// }

// I读入文件 调用格式： 〈字节集〉 读入文件 （文本型 文件名） - 系统核心支持库->磁盘操作
// 英文名称：ReadFile
// 返回一个字节集，其中包含指定文件的所有数据。本命令为初级命令。
// 参数<1>的名称为“文件名”，类型为“文本型（text）”。
//
// 操作系统需求： Windows、Linux
func (*W文件) D读入_文件(文件名 string) (data []byte, err error) {
	data, err = os.ReadFile(文件名)
	if len(data) >= 3 && data[0] == 239 && data[1] == 187 && data[2] == 191 {
		if 全_文本.P判断后缀(文件名, ".txt") || 全_文本.P判断后缀(文件名, ".json") || 全_文本.P判断后缀(文件名, ".sql") {
			data = data[3:]
		}
	}
	return
}

// I写到文件 调用格式： 〈逻辑型〉 写到文件 （文本型 文件名，字节集 欲写入文件的数据，... ） - 系统核心支持库->磁盘操作
// 英文名称：WriteFile
// 本命令用作将一个或数个字节集顺序写到指定文件中，文件原有内容被覆盖。成功返回真，失败返回假。本命令为初级命令。命令参数表中最后一个参数可以被重复添加。
// 参数<1>的名称为“文件名”，类型为“文本型（text）”。
// 参数<2>的名称为“欲写入文件的数据”，类型为“字节集（bin）”。
//
// 操作系统需求： Windows、Linux
func (*W文件) X写到_文件(文件名 string, 欲写入文件的数据 []byte) error {
	return os.WriteFile(文件名, 欲写入文件的数据, os.ModePerm)
}

func (*W文件) X写到_文件尾(文件名 string, 欲写入文件的数据 []byte) (返回_结果 error) {
	dst, err := os.OpenFile(文件名, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.ModePerm)
	if err != nil {
		返回_结果 = err
		return
	}
	defer dst.Close()
	_, err = dst.Write(欲写入文件的数据)
	if err1 := dst.Close(); err1 != nil && err == nil {
		返回_结果 = err1
	}
	返回_结果 = err

	return
}

func (类 *W文件) Y运行_文件(文件名 string) (返回_结果 error) {
	if !类.P判断文件_是否存在(文件名) {
		返回_结果 = errors.New("错误:文件不存在")
		return
	}
	cmd := exec.Command("cmd", "/c", "start", 文件名)
	返回_结果 = cmd.Start()
	return
}

func (类 *W文件) Y运行_文件_去黑框(文件名 string) (返回_结果 error) {
	if !类.P判断文件_是否存在(文件名) {
		返回_结果 = errors.New("错误:文件不存在")
		return
	}
	cmd := exec.Command("cmd", "/c", "start", 文件名)
	cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} // 隐藏黑框
	返回_结果 = cmd.Start()
	return
}

func (类 *W文件) Q取目录内_文件名组(目录路径 string) (文件名组 []string, 错误 error) {
	files, err := os.ReadDir(目录路径)
	if err != nil {
		错误 = err
		return
	}
	文件名组 = make([]string, len(files))
	for i, v := range files {
		文件名组[i] = v.Name()
	}
	return
}

func (类 *W文件) Embed内存文件_释放到目录(Embedfs文件 embed.FS,释放文件名称,保存路径 string) (返回错误 error) {
	返回错误=embed内存文件释放到目录(Embedfs文件,Embedfs文件,释放文件名称,保存路径)
	return
}
